package com.cn.qtms.base.service;

import com.cn.qtms.base.dao.BaseDao;
import com.cn.qtms.base.entity.BaseEntity;
import com.cn.qtms.common.page.QueryCondition;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

import java.util.List;
import java.util.Optional;

/**
 * @Name:BaseService
 * @Description: 基础业务接口
 * @Author: Neil
 * @Date: 2019-08-21 15:59
 **/
public interface BaseJpaService<T extends BaseEntity, ID>{

    /**
     * 获取dao层方法
     * @return
     */
    BaseDao<T, ID> getDao();

    /**
     * 保存单条数据
     * @param entity
     * @return
     */
    T save(T entity);

    /**
     * 多数据保存
     * @param entities
     * @return
     */
    Iterable<T> save(Iterable<T> entities);

    /**
     * 根据id删除数据
     * @param id
     */
    void deleteById(ID id);

    /**
     * 删除对象
     * @param entity
     */
    void delete(T entity);

    /**
     * 根据条件删除对象
     * @param entities
     */
    void deleteInBatch(Iterable<T> entities);

    /**
     * 全部删除
     */
    void deleteAll();

    /**
     * 根据id获取对象
     * @param id
     * @return
     */
    Optional<T> getById(ID id);

    /**
     * 判断id是否存在
     * @param id
     * @return
     */
    boolean exists(ID id);

    /**
     * 将T对象中的不为null的属性按与进行默认查询
     *
     * @param example
     * @return
     */
    boolean exists(T example);

    /**
     * 判断是否存在
     * @param example
     * @return
     */
    boolean exists(Example<T> example);

    /**
     * 获取表总数
     * @return
     */
    long count();

    /**
     * 将T对象中的不为null的属性按与进行默认查询
     *
     * @param example
     * @return
     */
    long count(T example);

    /**
     * 按照条件获取总数
     * @param example
     * @param <S>
     * @return
     */
    <S extends T> long count(Example<S> example);

    /**
     * 查询所有
     * @return
     */
    List<T> findAll();

    /**
     * 查询所有并排序
     * @param sort
     * @return
     */
    List<T> findAll(Sort sort);

    /**
     * 查询指定的id的所有
     * @param ids
     * @return
     */
    List<T> findAll(Iterable<ID> ids);

    /**
     * 按条件查询所有
     * @param example
     * @return
     */
    List<T> findAll(T example);

    /**
     * 按条件查询所有
     * @param example
     * @param <S>
     * @return
     */
    <S extends T> List<S> findAll(Example<S> example);

    /**
     * 按条件查询所有，并排序
     * @param example
     * @param sort
     * @param <S>
     * @return
     */
    <S extends T> List<S> findAll(S example, Sort sort);

    /**
     * 按条件查询所有，并排序
     * @param example
     * @param sort
     * @param <S>
     * @return
     */
    <S extends T> List<S> findAll(Example<S> example, Sort sort);

    /**
     * 分页查询 没有条件
     * @param pageable
     * @return
     */
    Page<T> findAll(Pageable pageable);

    /**
     * 分页查询带条件对象
     * @param example
     * @param pageable
     * @param <S>
     * @return
     */
    <S extends T> Page<S> findAll(S example, Pageable pageable);

    /**
     * 分页查询
     * @param example
     * @param pageable
     * @param <S>
     * @return
     */
    <S extends T> Page<S> findAll(Example<S> example, Pageable pageable);

    /**
     * 按照sql条件查总数
     * @param conditions
     * @return
     */
    long count(List<QueryCondition> conditions);

    /**
     * 按照sql条件查询所有
     * @param conditions
     * @return
     */
    List<T> findAll(List<QueryCondition> conditions);

    /**
     * 按照sql条件和排序规则查询所有
     * @param conditions
     * @param sort
     * @return
     */
    List<T> findAll(List<QueryCondition> conditions, Sort sort);

    /**
     * 按照sql条件和分页规则，分页查询
     * @param conditions
     * @param pageable
     * @return
     */
    Page<T> findAll(List<QueryCondition> conditions, Pageable pageable);

    /**
     * 按照sql条件判断是否存在
     * @param conditions
     * @return
     */
    boolean exists(List<QueryCondition> conditions);

    /**
     * 按照sql条件 分页查询
     * @param example
     * @param conditions
     * @param pageable
     * @return
     */
    public Page<T> findAll(T example, List<QueryCondition> conditions, Pageable pageable);

}
